package br.com.bomsabor.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import br.com.bomsabor.model.Garcom;
import br.com.bomsabor.model.Pedido;
import br.com.bomsabor.model.SituacaoPedido;

public class ImplPedidoDAO implements PedidoDAO {

	public Pedido incluir(Pedido p) {
		String sql = "INSERT INTO Pedido (dataPedido, valorPedido, situacao) " +
		"VALUES (?, ?, ?)";
		Connection con = GenericDAO.getConnection();
		
		try {
			PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			java.sql.Date dataSql = new java.sql.Date(p.getDataPedido().getTime());
			ps.setDate(1, dataSql);
			ps.setDouble(2, p.getValorTotal());
			String situacao = "A";
			ps.setString(3, situacao);
			ps.executeUpdate();

			ResultSet rs = ps.getGeneratedKeys();
			rs.next();
			p.setCodPedido(rs.getInt(1));
						
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return p;
	}

	public void alterar(Pedido p) {
		String sql = "UPDATE Pedido SET dataPedido = ?, valorPedido = ?, situacao = ? " +
					 "WHERE codPedido = ?";
		Connection con = GenericDAO.getConnection();
		PreparedStatement ps;
		try {
			ps = con.prepareStatement(sql);
			java.sql.Date dataSql = new java.sql.Date(p.getDataPedido().getTime());
			ps.setDate(1, dataSql);
			ps.setDouble(2, p.getValorTotal());
			String situacao = "A";
			switch (p.getSituacao()) {
				case EM_ABERTO:
					situacao = "A";	break;
				case CONCLUIDO:
					situacao = "R";	break;
				case CANCELADO:
					situacao = "C";	break;
			}
			ps.setString(3, situacao);
			ps.setLong(4, p.getCodPedido());
			ps.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void excluir(Pedido p) {
		String sql = "DELETE Pedido WHERE codPedido = ?";
		Connection con = GenericDAO.getConnection();
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setLong(1, p.getCodPedido());
			ps.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public Pedido pesquisar(Garcom g) {
		String sql = "SELECT * FROM Pedido WHERE codFunc = ?";
		Pedido p = null;
		Connection con = GenericDAO.getConnection();
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setLong(1, g.getCodFuncionario());
			ResultSet rs = ps.executeQuery();
			
			if(rs.next()){
				p = new Pedido();
				p.setCodPedido(rs.getLong("codPedido"));
				java.util.Date dataPedido = new java.util.Date(rs.getDate("dataPedido").getTime());
				p.setDataPedido(dataPedido);
				p.setValorTotal(rs.getDouble("valorPedido"));
				SituacaoPedido situacao = SituacaoPedido.EM_ABERTO;
				if("R".equals(rs.getString("situacao"))) {
					situacao = SituacaoPedido.CONCLUIDO;
				}else if("C".equals(rs.getString("situacao"))) {
					situacao = SituacaoPedido.CANCELADO;
				}
				p.setSituacao(situacao);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return p;
	}

	public Pedido pesquisar(long codPedido) {
		String sql = "SELECT * FROM Pedido WHERE codPedido = ?";
		Pedido p = null;
		Connection con = GenericDAO.getConnection();
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setLong(1, codPedido);
			ResultSet rs = ps.executeQuery();
			
			if(rs.next()){
				p = new Pedido();
				p.setCodPedido(codPedido);
				java.util.Date dataPedido = new java.util.Date(rs.getDate("dataPedido").getTime());
				p.setDataPedido(dataPedido);
				p.setValorTotal(rs.getDouble("valorPedido"));
				SituacaoPedido situacao = SituacaoPedido.EM_ABERTO;
				if("R".equals(rs.getString("situacao"))) {
					situacao = SituacaoPedido.CONCLUIDO;
				}else if("C".equals(rs.getString("situacao"))) {
					situacao = SituacaoPedido.CANCELADO;
				}
				p.setSituacao(situacao);
				
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return p;
	}

}
